C# Modbus 数据读取 使用NModBus4库 |
您所在的位置:网站首页 › EasyModbus 和modbus有啥区别 › C# Modbus 数据读取 使用NModBus4库 |
ModBus通讯协议
方法名 作用 所需参数 返回值 对应功能码 ReadCoils 读取DO的状态 从站地址(8位) byte slaveAddress 起始地址(16位)
ushort startAddress 读取数量(16位) ushort numberOfPoints bool[] 01 ReadInputs 读取DI的状态 从站地址(8位) byte slaveAddress 起始地址(16位)
ushort startAddress 读取数量(16位) ushort numberOfPoints bool[] 02 ReadHoldingRegisters 读取AO的值 从站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 读取数量(16位) ushort numberOfPoints ushort[] 03 ReadInputRegisters 读取AI的值 从站地址(8 位) byte slaveAddress 起始地址(16位)
ushort startAddress 读取数量(16位) ushort numberOfPoints ushort[] 04 WriteSingleCoil 写入值到DO 从站地址(8位) byte slaveAddress 线圈地址(16位) ushort coilAddress 写入值(布尔型) bool value 无返回值 05 WriteSingleRegister 写入值到AO 从站地址(8位) byte slaveAddress 寄存器地址(16位) ushort registerAddress 写入值(16位) ushort value 无返回值 06 WriteMultipleCoils 写多线圈寄存器 从站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 写入值(布尔型数组) bool[] data 无返回值 15 WriteMultipleRegisters 写多个保持寄存器 从站地址(8位) byte slaveAddress
起始地址(16位) ushort startAddress, 寄存器值(16位整型数组) ushort[] data 无返回值 16 ReadWriteMultipleRegisters 读写多个保持寄存器 从站地址(8位) byte slaveAddress 读起始地址(16位) ushort startReadAddress
读取数量(16位) ushort numberOfPointsToRead, 写入起始地址(16位) ushort startWriteAddress, 写入值(16位整型数组) ushort[] writeData ushort[] 23 Modbus Slave这个是安装包ModbusSlaveSetup64Bit 注册码:5455415451475662
modbus通讯协议NET库 这样的开源库很多,我这边用的库是github的开源实现类库:NModBus4,github地址:https://github.com/NModbus4/NModbus4
我用Modbus Slave模拟一个从机
设置数据
NModbus4的读取从机代码示例 1 IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 }); 2 using (TcpClient client = new TcpClient(address.ToString(), 502)) 3 { 4 client.SendTimeout = 1; 5 //client.op 6 ModbusIpMaster master = ModbusIpMaster.CreateIp(client); 7 //master.op 8 // read five input values 9 ushort startAddress = 0; 10 ushort numInputs = 10; 11 bool[] inputs = master.ReadCoils(1, startAddress, numInputs); 12 13 for (int i = 0; i < numInputs; i++) 14 { 15 Console.WriteLine($"Input {(startAddress + i)}={(inputs[i] ? 1 : 0)}"); 16 } 17 18 } 这边值得注意的是主机Read的方法第一个参数是slaveId 如果不加就startAddress And numInputs NModbus就会默认 slaveId是0 一直异常( d(╯﹏╰)b 痛苦经历~~)
以上数据是 刚才设置的DO 状态 在演示一个读取AI的值
代码没差多少就是方法ReadInputRegisters不一样 . 以下是示例代码 1 IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 }); 2 using (TcpClient client = new TcpClient(address.ToString(), 502)) 3 { 4 client.SendTimeout = 1; 5 //client.op 6 ModbusIpMaster master = ModbusIpMaster.CreateIp(client); 7 //master.op 8 // read five input values 9 ushort startAddress = 0; 10 ushort numInputs = 10; 11 ushort[] inputs = master.ReadInputRegisters(2, startAddress, numInputs); 12 13 for (int i = 0; i < numInputs; i++) 14 { 15 Console.WriteLine($"Register {(startAddress + i)}={(inputs[i])}"); 16 } 17 18 }
|
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |